﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace ControlPresupuesto
{
    public partial class FrmSolicitudCompromisoRevisar_AprobarContrato : Form
    {
        private string codPresupuestoActual;
        private string codRubroActual;
        private string nombreProveedor;
        private string idProveedor;
        private bool ordenGlobal;


        //-- esta varible controla que la ventana se cierre sin solicitar confirmacion al usuario cuando la solicitud sea aprobada exitosamente
        private bool solicitudAprobada=false;

        public FrmSolicitudCompromisoRevisar_AprobarContrato(string codPresupuesto, string codSolicitud, string codContrato, string nombreProveedor, string idProveedor, bool ordenGlobal)
        {
            InitializeComponent();
            this.codSolicitudCompromisoTextBox.Text=codSolicitud;
            this.saldoDisponibleTextBox.Text = string.Empty;
            this.codPresupuestoTextBox.Text = codPresupuesto;
            this.codContratoTextBox.Text = codContrato;
            this.nombreProveedor = nombreProveedor;
            this.idProveedor = idProveedor;
            this.ordenGlobal = ordenGlobal;
            this.fechaAprobacionDateTimePicker.Value = DateTime.Now;
        }

        private void FrmRevisarSolicitudesCompromiso_Aprobar_Load(object sender, EventArgs e)
        {
            try
            {
                // TODO: esta línea de código carga datos en la tabla 'controlPresupuestoDataSet.spCentroCosto' Puede moverla o quitarla según sea necesario.
                this.spCentroCostoTableAdapter.Fill(this.controlPresupuestoDataSet.spCentroCosto);
                // TODO: esta línea de código carga datos en la tabla 'contratosDataSet.VISTA_CONTRATOS' Puede moverla o quitarla según sea necesario.
                this.vISTA_CONTRATOSTableAdapter.Fill(this.contratosDataSet.VISTA_CONTRATOS);
                // TODO: esta línea de código carga datos en la tabla 'controlPresupuestoDataSet.spPresupuestoAnualCabecera' Puede moverla o quitarla según sea necesario.
                this.spPresupuestoAnualCabeceraTableAdapter.Fill(this.controlPresupuestoDataSet.spPresupuestoAnualCabecera);
                // TODO: esta línea de código carga datos en la tabla 'controlPresupuestoDataSet.spRubroAsociacionCuenta' Puede moverla o quitarla según sea necesario.
                this.spRubroAsociacionCuentaTableAdapter.Fill(this.controlPresupuestoDataSet.spRubroAsociacionCuenta);
                // TODO: esta línea de código carga datos en la tabla 'controlPresupuestoDataSet.INFOR_CuentasContables' Puede moverla o quitarla según sea necesario.
                this.iNFOR_CuentasContablesTableAdapter.Fill(this.iNFORDataSet.INFOR_CuentasContables);
                // TODO: esta línea de código carga datos en la tabla 'controlPresupuestoDataSet.spRubro' Puede moverla o quitarla según sea necesario.
                this.spRubroTableAdapter.Fill(this.controlPresupuestoDataSet.spRubro);

                // TODO: esta línea de código carga datos en la tabla 'controlPresupuestoDataSet.spPresupuestoAnualPeriodo' Puede moverla o quitarla según sea necesario.
                this.spPresupuestoAnualPeriodoTableAdapter.FillBy(
                    this.controlPresupuestoDataSet.spPresupuestoAnualPeriodo,
                    "ConsultarPeriodosPresupuestoHastaMesActual",
                    null,
                    null,
                    this.codPresupuestoTextBox.Text,
                    null,
                    null,
                    null
                    );
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
                this.Close();
            }
        }
        
        private void FrmRevisarSolicitudesCompromiso_Aprobar_Shown(object sender, EventArgs e)
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.codContratoBuscadorAWIL.AWIL_Texto = this.codContratoTextBox.Text;
                this.codPresupuestoBuscadorAWIL.AWIL_Texto = this.codPresupuestoTextBox.Text;
                this.saldoDisponibleTextBox.Text = string.Empty;

                //--- se valida el codigo del contrato dependiendo del valor del parametro
                this.codContratoBuscadorAWIL.AWIL_ValidarCampo = (Utils.get().getValorParametro("ValidarCodigoContratosEnAppContratos") == "SI" ? true : false);


                //--- Si el DataRow no existe es porque el Codigo del contrato no es valido.
                if (this.codContratoBuscadorAWIL.AWIL_DataRowCurrent == null && Utils.get().getValorParametro("ValidarCodigoContratosEnAppContratos")=="SI")
                {
                    MessageBox.Show("El codigo de contrato \"" + this.codContratoTextBox.Text + "\" No es valido, Verifique.");
                    solicitudAprobada = true;
                    this.Close();
                    return;
                }

                this.iNFOR_ItemsOrdenCompraDataGridView.Rows.Add(false,this.codContratoBuscadorAWIL.AWIL_TextoDescripcion);
                this.descripcionTextBox.Text = this.codContratoBuscadorAWIL.AWIL_TextoDescripcion;
                this.valorTextBox.Text = (this.codContratoBuscadorAWIL.AWIL_DataRowCurrent == null ? "0.00" : Double.Parse(this.codContratoBuscadorAWIL.AWIL_DataRowCurrent["VALOR_PESOS"].ToString()).ToString());

                this.CodRubroBuscadorAWIL.Focus();
                //--- Selecciono el ultimo periodo correspondiente al mes actual
                
                int mes = DateTime.Now.Month;
                this.periodoBuscadorAWIL.AWIL_Texto = this.codPresupuestoTextBox.Text.Replace("PR", "") + (mes < 10 ? "0" : "") + mes.ToString();                
                //this.periodoBuscadorAWIL.AWIL_Texto = "201301";

            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
            Cursor.Current = Cursors.Default;
        }

        private void codPresupuestoBuscadorAWIL_Enter(object sender, EventArgs e)
        {
            this.codPresupuestoActual = this.codPresupuestoBuscadorAWIL.AWIL_Texto;
        }

        private void codPresupuestoBuscadorAWIL_Leave(object sender, EventArgs e)
        {
            string filtroTemporal = string.Empty;
            try
            {
                //-- Si se cambio el CodPresupuesto, blanqueo los filtros CodRubro, CodCentroCostoBuscadorAWIL y CodCuentaBuscadorAWIL
                if (this.codPresupuestoBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty) || this.codPresupuestoActual!=this.codPresupuestoBuscadorAWIL.AWIL_Texto.Trim())
                {
                    this.CodRubroBuscadorAWIL.AWIL_Texto = string.Empty;
                    this.CodCentroCostoBuscadorAWIL.AWIL_Texto = string.Empty;
                    this.CodCuentaBuscadorAWIL.AWIL_Texto = string.Empty;
                    this.periodoBuscadorAWIL.AWIL_Texto = string.Empty;
                }

                //---- Preparo el filtro de los Rubros

                filtroTemporal = this.CodRubroBuscadorAWIL.AWIL_ColumnaRetorno + " IN ('',@@Param,)";
                // TODO: esta línea de código carga datos en la tabla 'controlPresupuestoDataSet.spPresupuestoAnualDetalle' Puede moverla o quitarla según sea necesario.
                this.spRubroTableAdapter.FillBy(
                    this.controlPresupuestoDataSet.spRubro,
                    "CargarRubrosPresupuesto",
                    this.codPresupuestoBuscadorAWIL.AWIL_Texto.Trim(),
                    null,
                    null,
                    null,
                    null,
                    null,
                    null
                    );
                //--Obtengo todos los centros de costo y los guardo en una variable que servira de filtro para mostrar solo aquellos centros de costo que esten asociados al rubro seleccionado en el presupuesto indicado.
                foreach (ControlPresupuestoDataSet.spRubroRow row in this.controlPresupuestoDataSet.spRubro.Rows)
                {
                    filtroTemporal = filtroTemporal.Replace("@@Param,", "'" + row.CodRubro + "',@@Param,");
                }
                filtroTemporal = filtroTemporal.Replace(",@@Param,", "");

                //--- Obtengo los periodos del presupuesto
                this.spPresupuestoAnualPeriodoTableAdapter.FillBy(
                    this.controlPresupuestoDataSet.spPresupuestoAnualPeriodo,
                    "ConsultarPeriodosPresupuestoHastaMesActual",
                    null,
                    null,
                    this.codPresupuestoTextBox.Text,
                    null,
                    null,
                    null
                    );

                //--- le asocio el nuevo filtro al bindingSource asociado al buscados de los centros de costo
                this.CodRubroBuscadorAWIL.AWIL_BindingSource.Filter = filtroTemporal;
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
                this.codPresupuestoBuscadorAWIL.Focus();
            }
        }

        private void CodRubroBuscadorAWIL_Leave(object sender, EventArgs e)
        {
            string filtroTemporal = string.Empty;
            //-- Si se cambio el rubro, blanqueo los filtros CodCentroCostoBuscadorAWIL y CodCuentaBuscadorAWIL
            if (this.CodRubroBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty) || !this.codRubroActual.Trim().Equals(this.CodRubroBuscadorAWIL.AWIL_Texto.Trim()))
            {
                this.CodCentroCostoBuscadorAWIL.AWIL_Texto = string.Empty;
                this.CodCuentaBuscadorAWIL.AWIL_Texto = string.Empty;
            }

            //---- Cargo todos los centros de costo asociados a @CodPresupuesto y @CodRubro, 
            //---- IMPORTANTE: Tambien se cargan los Centro de costos finales asociados a los grupos
            this.spCentroCostoTableAdapter.FillBy(
                this.controlPresupuestoDataSet.spCentroCosto,
                "CargarCenCostosActivosPresupuestoRubro",
                this.codPresupuestoBuscadorAWIL.AWIL_Texto.Trim() + '|' + this.CodRubroBuscadorAWIL.AWIL_Texto.Trim(),
                null,
                null,
                null,
                null,
                null
                );

            //---- Preparo el filtro de las cuentas contables

            filtroTemporal = this.CodCuentaBuscadorAWIL.AWIL_ColumnaRetorno + " IN ('',@@Param,)";
            // TODO: esta línea de código carga datos en la tabla 'controlPresupuestoDataSet.spPresupuestoAnualDetalle' Puede moverla o quitarla según sea necesario.
            this.spRubroAsociacionCuentaTableAdapter.FillBy(
                this.controlPresupuestoDataSet.spRubroAsociacionCuenta,
                "CargarCuentasContablesRubro",
                null,
                null,
                this.CodRubroBuscadorAWIL.AWIL_Texto,
                null,
                null,
                null
                );
            //--Obtengo todos los centros de costo y los guardo en una variable que servira de filtro para mostrar solo aquellos centros de costo que esten asociados al rubro seleccionado en el presupuesto indicado.
            foreach (ControlPresupuestoDataSet.spRubroAsociacionCuentaRow row in this.controlPresupuestoDataSet.spRubroAsociacionCuenta.Rows)
            {
                filtroTemporal = filtroTemporal.Replace("@@Param,", "'" + row.CodCuentaContable + "',@@Param,");
            }
            filtroTemporal = filtroTemporal.Replace(",@@Param,", "");
            //--- le asocio el nuevo filtro al bindingSource asociado al buscados de los centros de costo
            this.CodCuentaBuscadorAWIL.AWIL_BindingSource.Filter = filtroTemporal;

        }

        private void CodRubroBuscadorAWIL_Enter(object sender, EventArgs e)
        {
            this.codRubroActual = this.CodRubroBuscadorAWIL.AWIL_Texto;
        }
               
        private void guardarButton_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Desea Guardar la aprobación?", "COTECMAR", MessageBoxButtons.YesNo) == DialogResult.No)
            {
                return;
            }

            string DetalleContrato = string.Empty;
            
            try
            {
                //--- guardo la informacion del COntrato en un XML (este XML sera enviado al procedimiento almacenado spCompromisoSolicitud en el parametro @Observaciones para que valide y grabe la informacion)
                DetalleContrato = Utils.get().dataGridViewToXML(this.iNFOR_ItemsOrdenCompraDataGridView);
                
                //--- envio la informacion de la solicitud al procedimiento almacenado para que grabe la informacion y realice la validaciones correspondientes.
                this.spCompromisoSolicitudTableAdapter1.FillBy(
                    this.controlPresupuestoDataSet.spCompromisoSolicitud,
                    "AprobarSolicitudCompromiso",
                    DetalleContrato,
                    null,
                    this.codSolicitudCompromisoTextBox.Text,
                    null,
                    this.codContratoTextBox.Text,
                    this.fechaAprobacionDateTimePicker.Value,
                    null,
                    this.descripcionTextBox.Text.Trim(),
                    null,
                    this.codPresupuestoTextBox.Text,
                    null,
                    this.idProveedor,
                    this.nombreProveedor,
                    this.ordenGlobal
                    );
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
                //---Si se capturo alguna excepcion, le pregunto al usuario si desea rechazqar la orden.
                //if (MessageBox.Show("¿Desea rechazar la Solicitud de compromiso?", "COTECMAR", MessageBoxButtons.YesNo) == DialogResult.Yes)
                //{
                //    FrmRevisarSolicitudesCompromiso_Rechazar frmRechazar = new FrmRevisarSolicitudesCompromiso_Rechazar(this.codSolicitudCompromisoTextBox.Text);
                //    frmRechazar.ShowDialog();
                //}
                //this.solicitudAprobada = true;
                //this.Close();
                return;
            }
            
            //MessageBox.Show("Operacion realizada con exito");
            this.solicitudAprobada = true;
            this.Close();
        }

        private void cancelarButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void FrmRevisarSolicitudesCompromiso_Aprobar_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!solicitudAprobada)
            {
                if (MessageBox.Show("¿Desea cancelar la aprobación?", "COTECMAR", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    e.Cancel = true;
                }
            }
        }

        private void ContinuarButton_Click(object sender, EventArgs e)
        {
            //-- valido la informacion de los campos
            if (this.codPresupuestoBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty) || !this.codPresupuestoBuscadorAWIL.AWIL_ValorCorrecto)
            {
                MessageBox.Show("Debe seleccionar un Presupuesto valido");
                this.codPresupuestoBuscadorAWIL.Focus();
                return;
            }
            if (this.periodoBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty) || !this.periodoBuscadorAWIL.AWIL_ValorCorrecto)
            {
                MessageBox.Show("Debe seleccionar un Periodo valido");
                this.periodoBuscadorAWIL.Focus();
                return;
            }
            if (this.codPresupuestoBuscadorAWIL.AWIL_Texto.Trim().CompareTo(this.codPresupuestoTextBox.Text) < 0)
            {
                MessageBox.Show("El Presupuesto del compromiso, no puede ser anterior al presupuesto de la solicitud, Verifique.");
                this.codPresupuestoBuscadorAWIL.Focus();
                return;
            }
            if (this.CodRubroBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty) || !this.CodRubroBuscadorAWIL.AWIL_ValorCorrecto)
            {
                MessageBox.Show("Debe seleccionar un Rubro valido");
                this.CodRubroBuscadorAWIL.Focus();
                return;
            }
            if (this.CodCentroCostoBuscadorAWIL.AWIL_Texto.Trim().Length<4 || this.CodCentroCostoBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty) || !this.CodCentroCostoBuscadorAWIL.AWIL_ValorCorrecto)
            {
                MessageBox.Show("Debe seleccionar un Centro de costo valido");
                this.CodCentroCostoBuscadorAWIL.Focus();
                return;
            }
            if (this.CodCuentaBuscadorAWIL.AWIL_Texto.Trim().Length<2 || this.CodCuentaBuscadorAWIL.AWIL_Texto.Trim().Equals(string.Empty) || !this.CodCuentaBuscadorAWIL.AWIL_ValorCorrecto)
            {
                MessageBox.Show("Debe seleccionar una cuenta contable valida");
                this.CodCuentaBuscadorAWIL.Focus();
                return;
            }
            if (this.descripcionTextBox.Text.Trim().Equals(string.Empty))
            {
                MessageBox.Show("Debe Ingresar una descripcion para crear el compromiso");
                this.descripcionTextBox.Focus();
                return;
            }

            double tempValor = 0;
            double tempSaldoDisponible = 0;

            if (!double.TryParse(this.valorTextBox.Text.Trim(), out tempValor))
            {
                MessageBox.Show("El valor Total NO es valido");
                this.valorTextBox.Focus();
                return;
            }

            if (!double.TryParse(this.saldoDisponibleTextBox.Text.Trim(), out tempSaldoDisponible))
            {
                MessageBox.Show("El Saldo Disponible NO es valido");
                this.valorTextBox.Focus();
                return;
            }

            if (tempValor == 0)
            {
                MessageBox.Show("El valor del Compromiso NO puede ser Cero");
                this.valorTextBox.Focus();
                return;
            }

            if (tempValor > tempSaldoDisponible)
            {
                if (MessageBox.Show("El valor del Compromiso Supera el saldo disponible. Desea SOBREGIRAR el Presupuesto?", "", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    this.valorTextBox.Focus();
                    return;
                }
            }
            if ((this.CodCentroCostoBuscadorAWIL.AWIL_Texto.Trim().Substring(3, 1) != "1" || this.CodCuentaBuscadorAWIL.AWIL_Texto.Trim().Substring(0, 2) != "79") && (this.CodCentroCostoBuscadorAWIL.AWIL_Texto.Trim().Substring(3, 1) != "0" || this.CodCuentaBuscadorAWIL.AWIL_Texto.Trim().Substring(0, 2) != "51"))
            {
                MessageBox.Show("Los Centros de Costo con 4to Digito \"1\" se Afectan con Cuentas \"79\" y Los Centros de Costo con 4to Digito \"0\" se Afectan con Cuentas \"51\"");
                this.CodCuentaBuscadorAWIL.Focus();
                return;
            }
            
            foreach (DataGridViewRow row in this.iNFOR_ItemsOrdenCompraDataGridView.Rows)
            {
                row.Cells["Procesado"].Value = true;
                row.Cells["Descripcion"].Value = this.descripcionTextBox.Text.Trim();
                row.Cells["Valortotal"].Value = tempValor.ToString().Replace(",", "."); // this.valorTextBox.Text;
                row.Cells["CodPresupuesto"].Value = this.codPresupuestoBuscadorAWIL.AWIL_Texto;
                row.Cells["CodRubro"].Value = this.CodRubroBuscadorAWIL.AWIL_Texto;
                row.Cells["CodCentroCosto"].Value = this.CodCentroCostoBuscadorAWIL.AWIL_Texto;
                row.Cells["CodCuentaContable"].Value = this.CodCuentaBuscadorAWIL.AWIL_Texto;
                row.Cells["Periodo"].Value = this.periodoBuscadorAWIL.AWIL_Texto;

            }
            this.fechaAprobacionDateTimePicker.Enabled = false;
            this.codPresupuestoBuscadorAWIL.Enabled = false;
            this.periodoBuscadorAWIL.Enabled = false;
            this.CodRubroBuscadorAWIL.Enabled = false;
            this.CodCentroCostoBuscadorAWIL.Enabled = false;
            this.CodCuentaBuscadorAWIL.Enabled = false;
            this.CodCuentaBuscadorAWIL.Enabled = false;
            this.ContinuarButton.Enabled = false;
            this.descripcionTextBox.Enabled = false;
            this.valorTextBox.Enabled = false;
            this.guardarButton.Enabled = true;
            
            //-- Muestro la valor del compromiso y el saldo disponible del Rubro-CenCosto
            this.MostrarSaldoDisponible();

            return;
        }

        private void MostrarSaldoDisponible()
        {
            try
            {
                string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings[Utils.get().getValorParametro("SeccionAppConfigControlPresupuestoConnectionString")].ConnectionString;
                DataTable table = new DataTable();
                using (SqlConnection conn = new System.Data.SqlClient.SqlConnection(connectionString))
                {
                    conn.Open();
                    SqlCommand command = conn.CreateCommand();
                    command.CommandType = CommandType.StoredProcedure;
                    command.CommandText = "[spPresupuestoAnualDetalle]";
                    command.Parameters.Add(new SqlParameter("@OP", "ObtenerSaldoDisponiblePresupuestoRubroCenCosto"));
                    command.Parameters.Add(new SqlParameter("@CodPresupuesto", this.codPresupuestoBuscadorAWIL.AWIL_Texto));
                    command.Parameters.Add(new SqlParameter("@CodRubro", this.CodRubroBuscadorAWIL.AWIL_Texto));
                    command.Parameters.Add(new SqlParameter("@CodCentroCosto", this.CodCentroCostoBuscadorAWIL.AWIL_Texto));
                    table.Load(command.ExecuteReader());
                    conn.Close();
                }
                if (table.Rows.Count > 0)
                {
                    double tempValor = 0;
                    if (!double.TryParse(table.Rows[0]["ValorPendienteEjecutar"].ToString(), out tempValor))
                    {
                        this.saldoDisponibleTextBox.Text = string.Empty;
                        return;
                    }
                    this.saldoDisponibleTextBox.Text = Utils.get().getFormatoMoneda(tempValor);
                    this.saldoDisponibleLabel.ForeColor = (tempValor > 0 ? Color.Black : Color.Red);
                }
                else
                {
                    this.saldoDisponibleTextBox.Text = string.Empty;
                }
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
            }
        }

        private void CodCentroCostoBuscadorAWIL_AWIL_TextChanged(object sender, EventArgs e)
        {
            this.MostrarSaldoDisponible();
        }

        private void valorTextBox_Leave(object sender, EventArgs e)
        {
            double temp = 0;

            if (double.TryParse(this.valorTextBox.Text.Trim(), out temp))
            {
                this.valorTextBox.Text = temp.ToString("#,0.00");
                this.valorTextBox.ForeColor = Color.Black;
            }
            else if (this.valorTextBox.Text.Trim().Equals(string.Empty))
            {
                this.valorTextBox.ForeColor = Color.Black;
            }
            else
            {
                this.valorTextBox.ForeColor = Color.Red;
                return;
            }
        }

        private void valorTextBox_TextChanged(object sender, EventArgs e)
        {
            double temp = 0;

            if (double.TryParse(this.valorTextBox.Text.Trim(), out temp) || this.valorTextBox.Text.Trim().Equals(string.Empty))
            {
                this.valorTextBox.ForeColor = Color.Black;
            }
            else
            {
                this.valorTextBox.ForeColor = Color.Red;
                return;
            }
        }

    }
}
